#include <libapdf.h>

/**
 * \param erro_no
 * \param detalhe_no
 * \param dados_usuario
 */
void erro_pdf(HPDF_STATUS erro_no, HPDF_STATUS detalhe_no, void *dados_usuario)
	{
	printf ("ERROR: error_no=%04X, detail_no=%d\n", (unsigned int) erro_no, (int) detalhe_no);
  	throw exception();
	}

APDF::APDF(string arquivo, int cols)
	{
	retorno = true;
	n_cols = cols;

	Tam_Fonte = 12;
	Salto = 3;
//	colunas = new PDF_COLUNA[n_cols];
	pag = pags = 1;
	Arq_PDF.clear();
	Arq_PDF = arquivo;
	PDF_doc = HPDF_New(erro_pdf,NULL);
	if (!PDF_doc)
		{
		cout << "Erro: não foi possível criar o objeto PDF." << endl;
		retorno = false;
		}

	HPDF_SetInfoAttr(PDF_doc,HPDF_INFO_AUTHOR,"Alcione Ferreira");
	HPDF_SetInfoAttr(PDF_doc,HPDF_INFO_CREATOR,"Alcione Ferreira");
	HPDF_SetInfoAttr(PDF_doc,HPDF_INFO_TITLE,"Classe APDF");
	HPDF_SetPageMode(PDF_doc,HPDF_PAGE_MODE_USE_OUTLINE);
	}

APDF::~APDF()
	{
	string CMD;
	try
		{
		HPDF_SaveToFile(PDF_doc,Arq_PDF.c_str());
		CMD.clear();
		#ifdef NO_LINUX
		CMD = "\""+Arq_PDF+"\"";
		ShellExecute(0, "open", CMD.c_str(), NULL, NULL, SW_SHOWDEFAULT);
		#else
		char *comando;
		CMD = "/usr/bin/xdg-open \""+Arq_PDF+"\"";
		comando = new char[CMD.length()+1];
		sprintf(comando,"%s",CMD.c_str());
		system (comando);
		delete comando;
		#endif
		retorno = true;
    	}
	catch(exception &resultado)
		{
		cout << resultado.what() << endl;
		retorno = false;
		}
	if (!retorno)
		{
		cout << "erro" << endl;
		}
	HPDF_Free(PDF_doc);
	//delete colunas;
	}

void APDF::set_arquivo(string arq)
	{
	Arq_PDF.clear();
	Arq_PDF = arq;
	}

void APDF::set_cabecalho (string texto)
	{
	string AUX;
	char *aux;
	int i;
	HPDF_REAL ini, final;

	Pagina = HPDF_AddPage (PDF_doc);
	HPDF_Page_SetSize(Pagina,HPDF_PAGE_SIZE_A4,HPDF_PAGE_PORTRAIT);

  	Altura = HPDF_Page_GetHeight (Pagina);
  	Largura = HPDF_Page_GetWidth (Pagina);
	Pos_Texto = Altura - (Tam_Fonte+Salto);
	
	Font_Definida = HPDF_GetFont (PDF_doc, "Helvetica", "WinAnsiEncoding");
  	HPDF_Page_SetFontAndSize (Pagina, Font_Definida, Tam_Fonte);

	HPDF_Page_BeginText (Pagina);
	aux = new char[texto.length()+1];
	strcpy(aux,texto.c_str());
	M_ini = 30;
	M_fim = Largura - 30;
	if (n_cols > 0)
		{
		if (colunas[0].inicio > 0)
			{
			M_ini = colunas[0].inicio;
			M_fim = Largura - colunas[0].inicio;
			}
		}
	HPDF_Page_TextRect (Pagina, M_ini, Pos_Texto, M_fim, (Tam_Fonte+Salto), converter(aux,1), HPDF_TALIGN_CENTER, NULL);
	HPDF_Page_EndText (Pagina);
	delete aux;
	Pos_Texto -= (Tam_Fonte+Salto);
	HPDF_Page_MoveTo (Pagina, M_ini, Pos_Texto);
  	HPDF_Page_LineTo (Pagina, M_fim, Pos_Texto);
  	HPDF_Page_Stroke (Pagina);
	//Pos_Texto -= (Tam_Fonte+3);
	for (i=0; i < n_cols; i++)
		{
		aux = new char[colunas[i].nome.length()+1];
		strcpy(aux,colunas[i].nome.c_str());
		HPDF_Page_BeginText (Pagina);
		HPDF_Page_TextRect (Pagina, colunas[i].inicio, Pos_Texto, colunas[i].fim, (Tam_Fonte+Salto), converter(aux,1), HPDF_TALIGN_CENTER, NULL);
		HPDF_Page_EndText (Pagina);
		delete aux;
		}
	Pos_Texto -= (Tam_Fonte+Salto);
	HPDF_Page_MoveTo (Pagina, M_ini, Pos_Texto);
  	HPDF_Page_LineTo (Pagina, M_fim, Pos_Texto);
  	HPDF_Page_Stroke (Pagina);
	//Pos_Texto -= (Tam_Fonte+3);
	}
	
void APDF::set_rodape ()
	{
	char *aux;
	Font_Definida = HPDF_GetFont (PDF_doc, "Helvetica", "WinAnsiEncoding");
  	HPDF_Page_SetFontAndSize (Pagina, Font_Definida, Tam_Fonte);
	Pos_Texto = 2*(Tam_Fonte+Salto);
	HPDF_Page_MoveTo (Pagina, M_ini, Pos_Texto);
  	HPDF_Page_LineTo (Pagina, M_fim, Pos_Texto);
  	HPDF_Page_Stroke (Pagina);
	aux = new char[40];
	sprintf (aux,"Página %d de %d",pag, pags);
	HPDF_Page_BeginText (Pagina);
	HPDF_Page_TextRect (Pagina, M_ini, Pos_Texto, M_fim, (Tam_Fonte+Salto), converter(aux,1), HPDF_TALIGN_CENTER, NULL);
	HPDF_Page_EndText (Pagina);
	delete aux;
	}

void APDF::set_texto()
	{
	int i, j, linhas;
	char *aux;
	set_cabecalho (string("Testando Cabeçalho"));
	linhas = (Pos_Texto - (2*(Tam_Fonte+Salto)))/(Tam_Fonte+Salto);
	for (i=0; i < linhas; i++)
		{
		for (j=0; j < n_cols; j++)
			{
			aux = new char[50];
			sprintf(aux,"Lin %d - Col %d",i, j);
			HPDF_Page_BeginText (Pagina);
			HPDF_Page_TextRect (Pagina, colunas[j].inicio, Pos_Texto, colunas[j].fim, (Tam_Fonte+Salto), converter(aux,1), colunas[j].alinhamento, NULL);
			HPDF_Page_EndText (Pagina);
			delete aux;
			}
		Pos_Texto -= (Tam_Fonte+Salto);
		}
	set_rodape ();
	}